#ifndef ABSTRACT_SOCKET_H
#define ABSTRACT_SOCKET_H

#include <string>

namespace sh
{
enum class WaitMode
{
    BLOCK = 0,  //阻塞
    NON_BLOCK   //非阻塞
};
class AbstractSocket
{
public:
    explicit AbstractSocket();
    virtual ~AbstractSocket();

    /**
     *  连接指定的socket
     */
    virtual void connectToHost(const std::string &hostName, int port);

    /**
     * 断开和主机的连接，如果未连接，则跳过
     */
    virtual void disconnectFromHost();

    /**
     * 阻塞等待connect成功，返回值表示在超时时间内是否连接成功
     */
    virtual bool waitForConnected(int msecs = 30000);

    /**
     * 发送数据，返回值表示发送成功的字节数
     */
    virtual int writeData(const char *data, int size);
    virtual int writeData(const std::string &data);

    /**
     * 读取指定数量的字节到data中，返回实际读取到的字节数
     */
    virtual int readData(char *data, int maxSize);

    /**
     * 读取指定数量的字节
     */
    virtual std::string readData(int maxSize);
private:
    bool initResult;
    int clientSocket;
    bool isConnected;

    std::string hostName;
    int port;
};
}

#endif //ABSTRACT_SOCKET_H
